package com.tsy.server.common;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tsy.server.common.page.PageDomain;
import com.tsy.server.common.page.TableSupport;
import com.tsy.server.common.util.ConvertUtil;
import com.tsy.server.common.util.ServletUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

import static com.tsy.server.common.page.TableSupport.PAGE_NUM;
import static com.tsy.server.common.page.TableSupport.PAGE_SIZE;

/**
 * 分页工具类，封装MyBatis-Plus分页结果，统一返回结构
 */
@Data
@ApiModel(value = "统一分页返回结果", description = "API接口统一分页返回结果格式")
public class PageResult implements Serializable {

    private static final long serialVersionUID = 1L;

    /** 总记录数 */
    @ApiModelProperty(value = "总记录数", example = "10")
    private long total;

    /** 列表数据 */
    @ApiModelProperty(value = "列表数据",  example = "[{}]")
    private List<?> rows;


    /**
     * 封装分页器
     */
    public static <T> Page<T> buildPage() {
        if (ServletUtils.getParameter(PAGE_NUM) == null || ServletUtils.getParameter(PAGE_SIZE) == null) {
            throw new RuntimeException("分页参数不能为空");
        }
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        return new Page<>(pageNum, pageSize);
    }

    /**
     * 封装分页结果为统一返回结构
     * @param page MyBatis-Plus分页对象
     * @param <T> 数据类型
     * @return Result<PageResult>
     */
    public static <T> Result<PageResult> toPageResult(IPage<T> page) {
        PageResult rspData = new PageResult();
        rspData.setRows(page.getRecords());
        rspData.setTotal(page.getTotal());
        return Result.success(rspData);
    }


    /**
     * 将 IPage<T> 转换为带类型转换的分页结果
     * @param page 原始分页数据
     * @param clazz 目标类型的Class
     * @param <T> 原始类型
     * @param <V> 目标类型
     * @return 转换后的分页结果
     */
    public static <T, V> Result<PageResult> toPageResult(IPage<T> page, Class<V> clazz) {
        PageResult rspData = new PageResult();
        // 转换记录列表
        List<V> convertedList = ConvertUtil.convertList(page.getRecords(), clazz);

        rspData.setRows(convertedList);
        rspData.setTotal(page.getTotal());
        return Result.success(rspData);
    }

}